﻿#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//int main()
//{
//	char str1[] = "hello bit.";
//	char str2[] = "hello bit.";  //这两个是完全不同的数组 只是内容一样
//
//	const char* str3 = "hello bit.";  //这个指针指向常量字符串hello.bit.\0    不能被修改
//	const char* str4 = "hello bit.";  //这个指针指向常量字符串hello.bit.\0    所以没必要存两份 存一份即可
//
//	if (str1 == str2)
//		printf("str1 and str2 are same\n");
//	else
//		printf("str1 and str2 are not same\n"); //
//
//	if (str3 == str4)
//		printf("str3 and str4 are same\n"); //
//	else
//		printf("str3 and str4 are not same\n");
//
//	return 0;
//}

//这⾥str3和str4指向的是⼀个同⼀个常量字符串。C / C++会把常量字符串存储到单独的⼀个内存区域，
//当⼏个指针指向同⼀个字符串的时候，他们实际会指向同⼀块内存。但是⽤相同的常量字符串去初始
//化不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同，str3和str4相同。

// 指针数组 是数组 存放的是指针（地址）
// 数组指针 是指针
//之前我们学习了指针数组，指针数组是⼀种数组，数组中存放的是地址（指针）。
//数组指针变量是指针变量？还是数组？
//答案是：指针变量。
//我们已经熟悉：
//• 整形指针变量： int* pint; 存放的是整形变量的地址，能够指向整形数据的指针。
//• 浮点型指针变量： float* pf; 存放浮点型变量的地址，能够指向浮点型数据的指针。
//那数组指针变量应该是：存放的应该是数组的地址，能够指向数组的指针变量。

//int main()
//{
//	int arr[10] = { 1,2,3,4,5 };
//	int (*p)[10] = &arr; //拿到数组的地址 p是数组指针，p中存放的是数组的地址
//	//int(*)[10] = int(*)[10]
//
//	//arr -- int*    arr+1跳过四个字节
//	//&arr[0] -- int*  &arr[0]+1 跳过四个字节
//	//&arr -- int(*)[10] &arr+1 跳过四十个字节  这就是因为这个指针类型是数组
//	return 0;
//}

//数组指针变量
// int (*p)[10];  解释：p先和*结合，说明p是⼀个指针变量变量，然后指着指向的是⼀个⼤⼩为10个整型的数组。所以
//p是⼀个指针，指向⼀个数组，叫 数组指针。
//这⾥要注意：[]的优先级要⾼于* 号的，所以必须加上（）来保证p先和* 结合。
// int是p指向的数组的元素类型  p是数组指针变量名  [10]是p指向数组的元素个数

//int main()
//{
//	char* ch[5];
//	char* (*pc)[5] = &ch;  
//}

//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int (*p)[10] = &arr; // 取出的是数组的地址
//	// 想使用p这个数组指针访问arr数组的内容
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", (*p)[i]);  // *解引用就得到arr 然后[]访问下标为i
//		//*与&解引用可以相互抵消的
//	}
//	return 0;
//}

//所以对一维数组指针 如果我们非要用指针访问数组的话
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int *p = arr; //数组名就是首元素地址
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", p[i]);  // p[i] --- *(p+i)
//	}
//	return 0;
//}